// game-state.js
/**
 * @file 游戏状态模块
 * @description 管理所有地图的玩家与怪物状态（内存存储）
 */

const { MAPS, getMapConfig } = require('../config/game');

let maps = {};

/**
 * 初始化所有地图状态
 * ✅ 必须在 initMapConfig() 完成后调用
 */
async function init() {
  for (const mapId of MAPS) {
    try {
      const config = await getMapConfig(mapId);
      if (!config) {
        console.warn(`地图配置为空: ${mapId}`);
        continue;
      }
      maps[mapId] = {
        players: {},
        entrances: JSON.parse(JSON.stringify(config.entrances || [])),
        monsters: JSON.parse(JSON.stringify(config.monsters || [])),
        size: { width: config.width, height: config.height }
      };
    } catch (err) {
      console.error(`初始化地图失败 (${mapId}):`, err);
    }
  }
}

/**
 * 获取指定地图的状态
 * @param {string} mapId - 地图 ID
 * @returns {{ players: Object, monsters: Array, size: { width: number, height: number }}|null}
 */
function getMapState(mapId) {
  return maps[mapId] || null;
}

/**
 * 更新玩家在地图中的位置
 * @param {string} mapId - 地图 ID
 * @param {string} socketId - 玩家 Socket ID
 * @param {Object} playerData - 玩家数据 { x, y, userId }
 */
function updatePlayer(mapId, socketId, playerData) {
  if (maps[mapId]) {
    maps[mapId].players[socketId] = {
      id: socketId,
      ...playerData,
      map: mapId
    };
  }
}

/**
 * 删除地图中的玩家
 * @param {string} mapId - 地图 ID
 * @param {string} socketId - 玩家 Socket ID
 */
function removePlayer(mapId, socketId) {
  if (maps[mapId] && maps[mapId].players[socketId]) {
    delete maps[mapId].players[socketId];
  }
}

/**
 * 获取所有地图中指定玩家的信息
 * @param {string} socketId - 玩家 Socket ID
 * @returns {{ map: string, player: Object }|null}
 */
function findPlayer(socketId) {
  for (const mapId of MAPS) {
    const player = maps[mapId].players[socketId];
    if (player) {
      return { map: mapId, player };
    }
  }
  return null;
}

/**
 * 重置指定怪物血量（用于重生）
 * @param {string} mapId - 地图 ID
 * @param {string} monsterId - 怪物 ID
 */
function resetMonster(mapId, monsterId) {
  const monster = maps[mapId]?.monsters.find(m => m.id === monsterId);
  if (monster) {
    const original = getMapConfig(mapId).monsters.find(m => m.id === monsterId);
    if (original) monster.hp = original.maxHp;
  }
}

module.exports = {
  maps,
  init,
  getMapState,
  updatePlayer,
  removePlayer,
  findPlayer,
  resetMonster
};